#include "log_in.h"

/*
用户名 log_in
参数
    name  用户
    my_pos   密码
返回值
    无
功能
    实现登陆功能
        用户通过输入 账号密码 本函数进行判断
        如果3次错误 则等待 5 s 然后重新输入
        直到输入正确 然后退出
*/
void log_in(char (*name)[128], char *my_pos)
{
    system("clear");
    char in_name[128] = " "; // 用户输入的账号
    char in_pos[128] = " ";  // 用户输入的密码

    int flag_1 = 0;
    int num = 0; // 用于记录输入错误的次数
    /*
    flag_1 = -98  账号正确
    flag_1 = -99  账号错误
    flag_1 = 1    进入菜单
    */
   char l;//用于存放字符
    int i, j, k,x,y,z; // 用于判定是否要退出,和所需要时可以用于循环或判定的使用

    int pos;     // 用于猜数小游戏保存生成的随机数
    int ch_1[128]={0,0};//用于存放学生成绩，以用此来排名
    char buffer[100];  // 用于清除输入缓冲区
    while (1)
    {

        puts("请输入你的账号");
        scanf("%s", in_name);
        for (size_t i = 0; i < 10; i++)
        {
            if (!strcmp(in_name, name[i]))
            {
                puts("账号正确");
                flag_1 = -98; // 账号正确
                break;
            }
            if (i == 9) // 这里有bug
            {
                puts("账号错误");
                flag_1 = -99; // 账号错误
                num++;        // 记录用户输入错误的次数
            }
        }

        if (flag_1 == -98)
        {
            puts("请输入你的密码");
            scanf("%s", in_pos);
            if (!strcmp(in_pos, my_pos))
            {
                printf("恭喜这位帅哥登陆成功\n");
                
                printf("输入1进入菜单，退出输入其他\n");
                 
                scanf("%d", &i);
                if (1 == i)
                {

                    flag_1 = 1;
                    break;
                }

                return;
            }
            else
            {
                puts("密码错误");
                num++;
            }
        }

        if (num == 3)
        {
            num = 0;                // 错误次数请0
            Progress_Bar(0, 0, 10); // 打印进度条
        }
    }
    if (flag_1 == 1)
    out_2://游戏返回处

        printf("请输入要进入项目前面的数字：，按-1则退出\n1.100以内的猜数小游戏\n2.可控金字塔\n3.随机生成学生成绩\n");
        while(1){
        while (scanf("%d", &z) != 1)
       {
           while (getchar() != '\n');  // 清除当前行的剩余输入

        printf("输入错误，请输入一个数字：\n");
        printf("%d\n",i);
       }
       i=z;
         if (i!=1&&i!=2&&i!=3)
        {
           printf("输入错误请重新输入：\n");
        }
        if(i==1||i==2||i==3)
        {break;}
          }
            if (-1==i)
        {
            return;
        }
        
        switch (i)
        {
        case 1:
                system("clear");
        out_1: // 猜对小游戏之后继续游玩

            printf("游玩请按1：要退出请按其他数字\n");
            scanf("%d", &i);
    //           while(1){
    //       int num=  scanf("%d", &i);
    //     while (num != 1)
    //    {
    //        while (getchar() != '\n');  // 清除当前行的剩余输入

    //     printf("输入错误，请输入一个数字：\n");
    //    }
    //      if (i!=1&&i!=2&&i!=3)
    //     {
    //        printf("输入错误请重新输入：\n");
    //     }
    //     if(i==1||i==2||i==3)
    //     {break;}
    //       }
            if (i != 1)
            {
            goto out_2;
            }
            srand(time(NULL));      // 使用当前时间作为随机种子
            pos = rand() % 100 + 1; // 用于猜的数字
            int T, max = 100, min = 0;
            while (1)
            {
                printf("输入要猜的值：");
                scanf("%d", &T);
                if (T > max || T < min)
                {
                    printf("超出了数字范围，请重新输入\n");
                    continue;
                }
                if (T > pos)
                {
                    max = T;
                    printf("猜大了，数字在（%d，%d）\n", min, max);
                }
                if (T < pos)
                {
                    min = T;
                    printf("猜小了，数字在（%d，%d）\n", min, max);
                }
                if (T == pos)
                {
                    printf("猜对了\n");
                    goto out_1;
                }
            }
            break;
        case 2:
        system("clear");
            while (1)
            {
                
                printf("游玩请按1：要退出请按其他数字");
                scanf("%d", &i);
                if (i != 1)
                {
                goto out_2;
                }
                printf("请输入你所需要的金字塔的层数：");
                scanf("%d", &i);
                for (j = 0; j < i; j++)
                {
                    for (k = 0; k < i - j - 1; k++)
                    {
                        printf(" ");
                    }
                    for (k = 0; k < 2 * j + 1; k++)
                    {
                        printf("*");
                    }

                    printf("\n");
                }
            }
            break;
        case 3:
        system("clear");
            while (1)
            {
                printf("游玩请按1：要退出请按其他数字\n");
                scanf("%d", &i);
                if (i != 1)
                {
                goto out_2;
                }
                printf("1查看学生成绩等级\n2学生成绩顺序排列\n");
                scanf("%d", &x);
                if (x == 1)
                {
                      printf("请输入要随机生成几名同学的成绩\n");
                scanf("%d", &i);
                if (i > 100)
                {
                    printf("人数超出了100，请重新输入\n");
                    i = 0;
                    continue;
                }

                int ch[128] = {0};
                
                for (j = 0; j < i; j++)
                {
                 pos = rand() % 100 + 1; //
                    ch[j] = pos;
                    if (100>=ch[j]&&ch[j]>=90)
                    {
                       l='A';
                    }
                    else if (90>ch[j]&&ch[j]>=80)
                    {
                       l='B';
                    }
                    
                    else if (80>ch[j]&&ch[j]>=70)
                    {
                       l='C';
                    }
                    else if (70>ch[j]&&ch[j]>=60)
                    {
                       l='D';
                    }
                    else if (60>ch[j]&&ch[j]>=0)
                    {
                       l='F';
                    }
                    printf("第%d位学生成绩%d等级为%c\n", j + 1, ch[j],l);
                }

                }
                if (2 ==x)
                {
                 printf("请输入要随机生成几名同学的成绩\n");
                scanf("%d", &i);
                if (i > 100)
                {
                    printf("人数超出了100，请重新输入\n");
                    i = 0;
                    continue;
                }

                int ch[128] = {0};
                
                for (j = 0; j < i; j++)
                {
                pos = rand() % 100 + 1; //
                    ch[j] = pos;
                    ch_1[j] = ch[j];
                  
                }
                int i_1,i_2,temp;//用于实现冒泡
                for (i_1 = 0; i_1 < i - 1; i_1++)//循环多少次
                {
                    for (i_2 = 0; i_2 < (i-i_1-1); i_2++)//一次循环进行多少次比较
                    {
                        if (ch_1[i_2] > ch_1[i_2 + 1])// 如果前面的数比后面的数大交换
                        {
                            temp = ch_1[i_2];
                            ch_1[i_2] = ch_1[i_2 + 1];
                            ch_1[i_2 + 1] = temp;
                        }
                    }
                    
                }
                int i_4=i;
                for ( int i_3 = 0; i_3 <i; i_3++)
                {
                    printf("学生排名为：%d名分数是%d\n", i_3+ 1, ch_1[--i_4]);
                }
                
                

                }
                }

            
            break;

        default:
            break;
        }
    }


// 
//                     for ( i = 0; i < count; i++)
//                     {
//                         /* code */
//                     }  printf("学生成绩排名为：%d名是第%d位学生\n", ,j +1);

/*
用户名 Progress_yBar
参数
    @x              想要显示的位置 x
    @y              想要显示的位置 y
    @time_length    想要延时的时间
返回值
    无
功能
    进度条功能
*/
void Progress_Bar(int x, int y, float time_length)
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = ((time_length / 100) * flag) * 100;
        printf("%.2f%%\n", percent);
        temp += 0.01;
        flag += 0.01;
        if (fabs((flag - 0.01) - time_length) < EPSILON)
        {
            break;
        }

        // 监控数据

        // printf("\n%.2f", flag);
        // printf("\n%.2f", time_length);
        // printf("\n%.2f", temp);
        // printf("\n%.2f", mean);
        // printf("\n%d", num);

        fflush(stdout);
        usleep(10000);
        system("clear");
    }
    system("clear");
}
